import { observable, action ,toJS,runInAction} from "mobx";





// 编辑商品数据
export default class ProductEdit{
  
  // 商品id
  @observable id=0;
  // 分类名称
  @observable ttit="";
  // 地区名称
  @observable atit="";
  // 商品数据
  @observable data={};
  @observable dataDouble=false;//服务器数据对比是否修改过
  
  @observable loading=false;
  @observable loadingUploadImage=false;
  // 是否展示大图
  @observable previewImageVisible=false;
  // 展示的大图地址
  @observable previewImageUrl=false;
  
  // 商品分类
  @observable options=[];

  constructor(root){
    this.root = root;
  }
  
  @action set=(k,v)=>{
    const arr = k.split("-");
    const loop = (obj,arr,v)=>{
      const temp = arr.splice(0,1);
      if(arr.length){
        obj = obj[temp];
        loop(obj,arr,v);
      }else{
        obj[temp] = v;
      }
    };
    loop(this,arr,v);
  };
  
  // 初始化数据
  @action init=()=>this._init();
  _init(){
    this.set("data",{
      product:{
        sid:"",
        priceall:0,
        shopsrecommend:0,
        shutdown:0,
        coupon:0,
        buyout:0,
        pricetm:"",
        leaseTerm:[],
        args:[],
        prices:[],
      },
      detail:[],
      image:[],
      params:{params:[],prices:[]},
    });
    this.root.set("dataDouble",false);
    this.root.set("loading",false);
    this.root.set("loadingUploadImage",false);
    this.set("options",[]);
    this.set("atit","北京市");
    // 如果有id则获取商品信息
    if(this.id){
      this._info();
    }else{
      this.set("ttit","");
    }
    // 获取分类数据
    if(!this.options.length){this._optionsData();}
    
  }
  // 商品信息
  _info(){
    this.root.ajax.post({
      url:this.root.url,
      data:{act:"admin-product-select",id:this.id},
      success:json=>{
        if(json.status==="ok"){
          // 分类名称
          const {ttit, ...product} = json.data.product;
          json.data.product=product;
          this.set("ttit",ttit);
          // 地区名称
          if(json.data.product.addr){
            let atit="";
            const seach=(addr)=>{
              addr.map(item=>{
                if(item.value===Number(json.data.product.addr)){
                  atit=item.label;
                }else if(item.children){
                  seach(item.children);
                }
              });
            };
            seach(this.root.addr);
            // console.log(atit);
            if(atit){
              this.set("atit",atit);
            }
          }
          // 价格变成浮点数
          json.data.product.price = this.root.fenToYuan(json.data.product.price);

          json.data.product.priceall = this.root.fenToYuan(json.data.product.priceall);
          json.data.product.deposit = this.root.fenToYuan(json.data.product.deposit);

          
          // 租期
          json.data.product.leaseTerm=JSON.parse(json.data.product.leaseTerm);
          // 类型参数
          json.data.product.args=JSON.parse(json.data.product.args);
          // 型号价格
          json.data.product.prices=JSON.parse(json.data.product.prices);
          json.data.product.prices=json.data.product.prices.map(item=>Object.assign({},item,{price:this.root.fenToYuan(item.price)}))

          // 轮播图
          if(json.data.image && json.data.image.length){
            const image = json.data.image.map((item,index)=>{
              const sfx=item.image.split(',');
              return {
                uid: `-${index+1}`,
                name: "image.".concat(sfx[sfx.length-1]),
                status: 'done',
                url:item.image
              };
            });
            json.data.image=image;
          }
          // 详细内容
          if(json.data.detail && json.data.detail.length){
            const detail = json.data.detail.map((item,index)=>{
              const sfx=item.image.split(',');
              return {
                uid: `-${index+1}`,
                name: "image.".concat(sfx[sfx.length-1]),
                status: 'done',
                url:item.image
              };
            });
            json.data.detail=detail;
          }
          
 

          this.set("data",json.data);

          this.set("dataDouble",json.data);
        }
      }
    })
  }
  
    // 加载下拉菜单
  @action onLoadOption = selectedOptions => this._onLoadOption(selectedOptions);
  _onLoadOption(selectedOptions) {
    const targetOption = selectedOptions[selectedOptions.length - 1];
    console.log(targetOption);
    targetOption.loading = true;
    this.root.set("loading",true);
    this._find(targetOption.id,json=>{
      targetOption.loading = false;
      this.root.set("loading",false);
      if(json.status !== "ok"){
        this.root.modal.info({
          title:"提示",
          content:json.msg
        });
        return;
      }
      if(json.data.length){
        runInAction(()=>{
          targetOption.children = json.data.map(item=>Object.assign({value:item.id,label:item.tit,isLeaf:(Number(item.num)===0)},item));
        });
        runInAction(()=>this.set("options",[...this.options]));
      }
    });
  }

  // 商品分类数据初始化
  @action optionsData=()=>this._optionsData();
  _optionsData(){
    const tm = setInterval(()=>{
      if(this.root.website.sys && this.root.website.sys.productid){
        this._find(this.root.website.sys.productid,json=>{
          this.root.set("loading",false);
          if(json.status !== "ok"){this.root.alert(json);return;}
          const options=json.data.map(item=>Object.assign({value:item.id,label:item.tit,isLeaf:(Number(item.num)===0)},item));
          this.set("options",[{label:"商品分类",value:this.root.website.sys.productid,children:options}]);
        });
        clearInterval(tm);
      }
    },500);
    
  }

    // 获取分类数据
  _find(upid,func){
    this.root.set("loading",true);
    this.root.ajax.post({
      url:this.root.url,
      data:{act:"admin-type-select",upid:upid},
      success:func
    });
  }
 
  // insert-update
  @action submit=()=>{
    const {product}=this.data;
    
    
    if(!product.image){
      this.root.antd.modal.error({title:"错误",content:"请上传图片"});
      return;
    }else if(!product.tit){
      this.root.antd.modal.error({title:"错误",content:"缺少名称"});
      return;
    }else if(!product.tid){
      this.root.antd.modal.error({title:"错误",content:"缺少分类"});
      return;
    }else if(!product.unit){
      this.root.antd.modal.error({title:"错误",content:"缺少单位"});
      return;
    }
    

      

    this.root.set("loading",true);
    let data={
      act:"admin-product-update",
      id:0,
      data:{
        product:{},
        detail:{},
        image:[],
        params:{params:[],prices:[]},
      }
    };
    data.data.product=this._submitProduct();
    


    if(this.id){//update
      data.id=this.id;
      // images
      let boolImageNum=0;
      this.data.image.map(item=>{
        this.dataDouble.image.map(item2=>{
          if(item==item2){
            boolImageNum+=1;
          }
        });
      });
      if(!this.id || this.data.image.length != this.dataDouble.image.length || this.data.image.length!=boolImageNum){
        data.data.image=this.data.image.map(item=>item.url);
      }

      // detail
      boolImageNum=0;
      this.data.detail.map(item=>{
        this.dataDouble.detail.map(item2=>{
          if(item==item2){
            boolImageNum+=1;
          }
        });
      });
      if(!this.id || this.data.detail.length !== this.dataDouble.detail.length || this.data.detail.length!==boolImageNum){
        data.data.detail=this.data.detail.map(item=>item.url);
      }
      data.data.product.priceall = this.root.yuanToFen(this.data.product.priceall);
      data.data.product.price=this.root.yuanToFen(this.data.product.price);
      data.data.product.deposit=this.root.yuanToFen(this.data.product.deposit);

      data.data.product.args=JSON.stringify(this.data.product.args);
      data.data.product.leaseTerm=JSON.stringify(this.data.product.leaseTerm);
      const prices = this.data.product.prices.map(item=>Object.assign({},item,{price:this.root.yuanToFen(item.price)}));
      data.data.product.prices=JSON.stringify(prices);

    }else{//insert
      data.act="admin-product-insert";

      data.data.image=this.data.image.map(item=>item.url);
      data.data.detail=this.data.detail.map(item=>item.url);

      data.data.product.priceall = this.root.yuanToFen(this.data.product.priceall);
      data.data.product.price=this.root.yuanToFen(this.data.product.price);
      data.data.product.deposit=this.root.yuanToFen(this.data.product.deposit);
      
      data.data.product.args=JSON.stringify(this.data.product.args);
      data.data.product.leaseTerm = JSON.stringify(this.data.product.leaseTerm);     
      const prices = this.data.product.prices.map(item=>Object.assign({},item,{price:this.root.yuanToFen(item.price)}));
      data.data.product.prices=JSON.stringify(prices);


    }
    
    // return;
    data.data = JSON.stringify(toJS(data.data));
    this.root.ajax.post({
      url:this.root.url,
      data:data,
      success:json=>{
        this.root.set("loading",false);
        this.root.alert(json);
        if(json.status !== "ok"){
          this.root.alert(json);
          return;
        }
        this._info();
      }
    });
  }
  

  // 上传图片
  @action uploadChange=(info,tp)=>{
    if(info.file.status === "uploading"){
      this.root.set("loadingUploadImage",true);
    }else if (info.file.status === "done"){
      this.root.set("loadingUploadImage",false);
      this.set("data-product-image",info.file.response.data);
    }else if (info.file.status === "error") {
      this.root.alert({status:"error","msg":`${info.file.name} 图片上传失败!.`});
      this.root.set("loadingUploadImage",false);
    }else{
      this.root.set("loadingUploadImage",false);
    }
  }


  @action getBase64(file) {
    return new Promise((resolve, reject) => {
      const reader = new FileReader();
      reader.readAsDataURL(file);
      reader.onload = () => resolve(reader.result);
      reader.onerror = error => reject(error);
    });
  }

    // 上传基本信息解析
  _submitProduct(){
    const productKeys = Object.keys(this.data.product);
    const product={};
    productKeys.map(key=>{
      if(!this.dataDouble || this.data.product[key] !== this.dataDouble.product[key]){
        product[key]=this.data.product[key];
      }
    });
    return product;
  }

}